<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 编程题，找出字符串中连续出现最多的字符和个数（蘑菇街）
        let str1 = 'abcaakjbb' //=> {'a':2,'b':2}
        let str3 = 'aaakbbbjccjjaaa'    // =>{a: 3, b: 3}
        // 第一种 借用对象
        // 1 拿到连续出现最多的字母作为属性，分别出现的次数作为对应的属性值.次数最多的就是想要的。
        function getRes(e, o = {}, dataArr = [], valueArr = [], flag = false, max = '', maxObj = {}) {
            let j = 1
            for (let i = 0; i < e.length; i++) {
                if (e[i] == e[i + 1]) {
                    j += 1
                    flag = true                 //flag 是为了保障 必须是在连续的前提下 才push  aabcd难道bcd要push吗，肯定不。所以flag
                } else {
                    if (flag) {
                        o[e[i]] = j
                        flag = false
                    }
                    j = 1
                }
            }
            console.log(o)      // {a: 3, b: 3, c: 2, j: 2}
            // 2 拿到对象值最大的 属性值 
            for (let i in o) {
                max = max > o[i] ? max : o[i]
            }
            console.log(max)
            //4 return 
            return getKey(o, max, maxObj)
        }
        // 3 通过属性值 找 对象对应的 key 
        function getKey(o, key, maxObj) {
            Object.keys(o).forEach(item => {      //Object.keys(对象)返回的是一个数组，这个数组记录了所有属性
                if (o[item] == key) {
                    console.log(item)
                    console.log(maxObj)
                    maxObj[item] = key
                }
            })
            return maxObj
        }
        console.log(getRes('aaakbbbjccjjaaa'))

        // 第二种 采用数组法  分别记录 对应的字母和出现的次数 
        function getResSecond(e, o = {}, dataArr = [], valueArr = [], flag = false) {
            let j = 1
            for (let i = 0; i < e.length; i++) {
                if (e[i] == e[i + 1]) {
                    j += 1
                    flag = true                 //flag 是为了保障 必须是在连续的前提下 才push  aabcd难道bcd要push吗，肯定不。所以flag
                } else {
                    if (flag) {
                        console.log(i)
                        dataArr.push(e[i])     // 记录 连续出现的字母
                        valueArr.push(j)        //记录出现的次数
                        flag = false
                    }
                    j = 1
                }
            }
            console.log(dataArr)        //["a", "b", "c", "j", "a"]
            console.log(valueArr)       //[3, 3, 2, 2, 3]
            let max;                 // 拿到出现次数最大的那个值  记下来 
            let maxI = []       // 数组有一个就只有一个最大的，有两个说明有两个最大的 记录 索引  去 dataArr里拿
            for (let i = 0; i < valueArr.length; i++) {
                max = max >= valueArr[i] ? max : valueArr[i]            //3
            }
            // 在valueArr里查资这个max,找到后索引记录下来，就是最大的也是最多的
            for (let i = 0; i < valueArr.length; i++) {
                if (valueArr[i] == max) {
                    //  可能出现多个  3 3 3 2 2 
                    maxI.push(i)            // 3  出现了3次  记录下他们的索引  去dataArr里拿到索引对应的字母
                }
            }
            // 此时maxI记录了出现最多的 索引
            for (let item of maxI) {
                o[dataArr[item]] = max          // 不用担心 两个最大的值对应的字母一样，因为对象属性覆盖
            }
            return o
        }
        // console.log(getResSecond('aaakbbbjccjjaaa'))   



    </script>
</body>

</html>